import csv

#全局变量
data=[{'id':'1001','passwd':'123456','bat':'1000'},
      {'id':'1002','passwd':'123456','bat':'2000'},
      {'id':'1003','passwd':'123456','bat':'3000'},
      {'id':'1004','passwd':'123456','bat':'4000'}]

menu="""----------操作⻚⾯----------
1.存款
2.取款
3.查询余额
4.转账
5.退出
----------------------------"""

#函数
#存款(存钱只能存100的整数)
def cunMoney(ka1):
    try :
        money=input("请输⼊存款⾦额：")
        # 自定义异常，当输入金额为0时提示不能为0
        if int(money) == 0 :
            raise ZeroDivisionError("不能输入0")
        # 自定义异常，当输入金额小于0或者不是100的倍数时提示
        if int(money) < 0 or int(money)%100 != 0 :
            raise Exception("请输入大于100的倍数的正整数")
        # 做完判断再计算金额
        ka1["bat"]=str(int(ka1["bat"])+int(money))
        print(f"您已成功存款{money}，您当前的余额为：{ka1['bat']}")
    # 在计算金额部分已经将money定义为int类型，如果输入浮点数则会提示异常
    except ValueError: 
        print("请输入整数")
    # 提示输入金额为0时的异常
    except ZeroDivisionError as e:
        print(e)
    # 提示输入金额小于0或不是100倍数时的异常
    except Exception as e :
        print(e)


#取款(取钱可以取浮点数)
def quMoney(ka1):
    money=input("请输入取款金额：")
    if float(money) > float(ka1["bat"]) :
        print(f"输入金额大于存款余额！当前存款余额为{ka1['bat']}")
    elif float(money) <= float(ka1["bat"]) :
        ka1["bat"]=str(float(ka1["bat"])-float(money))
        print(f"您已成功取款{money},您当前的余额为：{ka1['bat']}")

#查询
def chaMoney(ka1):
    print(f"您当前的余额为：{ka1['bat']}")

#转账
def zhuanMoney(ka1):
    account=input("请输入收款账号:").strip() # 使用.strip()去除输入字符串两端的空白字符
    #标记法判断账号是否存在且不能为当前账号
    charge=False # 初始化一个布尔变量charge为false，用于标记是否找到收款账号
    target_account=None # 用于保存找到的收款账号的字典信息
    for i in data : # 遍历全局变量data，其中包含了所有账号信息的列表
        if account == str(i["id"]) : # 将当前遍历到的账号"id"字段转换为字符串(为确保类型一致),然后与输入的account字符串进行比较，如果相同，说明找到了输入的账号
            if account == userName : # 检查找到的账号是否是当前登录用户（`userName` 是全局变量，表示当前登录用户的账号）。
                print("不能转账给自己！") # 如果是，打印提示信息“不能转账给自己！”
                return 0 # 并退出函数（返回0）
            charge=True # 如果找到的账号不是当前用户自己，则将charge标记为True，表示找到了目标账号
            target_account=i # 将已经找到的账号字典信息赋值给target_account,后续就可以通过target_account这个变量名来对其账号信息进行操作，例如修改其余额
            break # 跳出循环(已经找到，无需继续遍历)

    if not charge : # 循环结束后检查charge是否为false(即没有找到收款账号)
        print("收款账号不存在！") # 如果没有找到收款账号，则打印提示信息
        return 0 # 并退出函数
    #判断余额是否足够转账
    money=float(input("请输入转账金额:")) # 输入要转账的金额，并将输入的字符串转换为整数类型
    if float(money) > float(ka1['bat']) : # 如果转账金额大于账号余额
        print(f"您的余额不足！当前余额为：{ka1['bat']}") # 则提示余额不足并显示当前余额
        return 0 # 并退出函数
    elif float(money) > 0 : # 如果转账金额大于0(且小于等于余额，上面的循环已经判断了大于余额的情况)，则执行转账操作
        ka1['bat']=str(float(ka1['bat'])-float(money)) # 将当前用户的余额(字符串)转换为整数，减掉相应的转账金额，再转换回字符串，以此来达到更新当前用户余额['bat']的目的
        target_account['bat']=str(float(target_account['bat'])+float(money)) # 将目标账户的余额(字符串)转换为整数，增加相应的转账金额，再转换回字符串，以此来达到更新目标用户余额['bat']的目的
        print(f"您已成功转账{money},您当前余额为:{ka1['bat']}") # 提示转账成功信息,并显示当前账号的余额
    else :
        print("转账金额必须大于0!") # 如果转账金额小于等于0，则提示信息"转账金额必须大于0"


# 把data保存到csv
def save() :
    with open("/root/python/user.csv",mode="w",encoding="UTF-8") as f :
        result=csv.DictWriter(f,fieldnames=["id","passwd","bat"])
        result.writeheader()
        result.writerows(data)
        f.close()

# 读取csv覆盖data
def init() :
    try :
        with open("/root/python/user.csv",mode="r") as f :
            result=csv.DictReader(f)
            data.clear()
            for i in result:
                data.append(i)
            f.close()
    except FileNotFoundError:
        print("没有文件使用原数据")

#入口
if __name__=="__main__":

    #获取最新数据
    init()

    ka={}
    print("---------- 欢迎使⽤ATM机 ----------")
    userName=input("请输⼊账号：")
    userPwd=input("请输⼊密码：")
    #标记法
    isLogin=False
    #找
    for i in data:
        if i["id"]==userName and i["passwd"]==userPwd:
            ka=i
            isLogin=True
            break

    #输出
    if isLogin==True:
        print("登录成功，请进⾏下列操作：")
        while True:
            print(menu)
            option=input("请输⼊操作选项：")
            if option=="1":
                cunMoney(ka)
            elif option=="2":
                quMoney(ka)
            elif option=="3":
                chaMoney(ka)
            elif option=="4":
                zhuanMoney(ka)
            elif option=="5":
                answer=input("请问是否退出? y/n:")
                if answer=="y" or answer=="Y" or answer=="yes":
                    print("已成功退出，请取回您的银⾏卡")
                    save()
                    break
            else:
                print("输⼊错误")

    else:
        print("账号或密码错误")